package p06_Aware与InitializingBean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.GenericApplicationContext;

/**
 * Aware是一系列接口，实现这些接口，重写接口方法后
 * spring容器在初始化前就会主动调用这些方法，并将一些容器相关的数据作为参数
 * 通过这种方式，可以实现bean注入
 */
public class _1_Aware implements BeanNameAware, BeanFactoryAware, ApplicationContextAware {

    public static void main(String[] args) {
        GenericApplicationContext context = new GenericApplicationContext();
        context.registerBean(_1_Aware.class);
        context.refresh();
        context.close();
        /**
         * 这些功能，通过@Autowired注解都能实现，为什么还要实现接口呢？
         * @Autowired是bean的后处理器实现的，在某些情况下会失效
         * 而这些接口是spring容器原生功能，不会失效
         */
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("beanFactory被注入了:" + beanFactory);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("bean的名字是" + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("applicationContext被注入啦" + applicationContext);
    }


}
